package com.zenithmind.document.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.document.pojo.domain.DocumentPermission;
import com.zenithmind.document.pojo.query.DocumentPermissionQueryDTO;
import com.zenithmind.document.pojo.vo.DocumentPermissionVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 文档权限映射器
 * 遵循单一职责原则：专注于文档权限数据访问
 * 遵循依赖倒置原则：定义抽象的数据访问接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Mapper
public interface DocumentPermissionMapper extends BaseMapper<DocumentPermission> {

    /**
     * 分页查询权限详情
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<DocumentPermissionVO> selectPermissionPageWithDetails(Page<DocumentPermissionVO> page, @Param("query") DocumentPermissionQueryDTO queryDTO);

    /**
     * 查询文档权限列表
     * 
     * @param documentId 文档ID
     * @return 权限列表
     */
    List<DocumentPermissionVO> selectDocumentPermissions(@Param("documentId") String documentId);

    /**
     * 查询用户权限列表
     * 
     * @param userId 用户ID
     * @return 权限列表
     */
    List<DocumentPermissionVO> selectUserPermissions(@Param("userId") String userId);

    /**
     * 检查用户权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param permission 权限类型
     * @return 是否有权限
     */
    Boolean checkUserPermission(@Param("documentId") String documentId, @Param("userId") String userId, @Param("permission") String permission);

    /**
     * 检查角色权限
     * 
     * @param documentId 文档ID
     * @param roleId 角色ID
     * @param permission 权限类型
     * @return 是否有权限
     */
    Boolean checkRolePermission(@Param("documentId") String documentId, @Param("roleId") String roleId, @Param("permission") String permission);

    /**
     * 授予用户权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param permissions 权限列表
     * @param grantorId 授权人ID
     * @return 影响行数
     */
    Integer grantUserPermissions(@Param("documentId") String documentId, @Param("userId") String userId, @Param("permissions") List<String> permissions, @Param("grantorId") String grantorId);

    /**
     * 撤销用户权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @param permissions 权限列表
     * @return 影响行数
     */
    Integer revokeUserPermissions(@Param("documentId") String documentId, @Param("userId") String userId, @Param("permissions") List<String> permissions);

    /**
     * 授予角色权限
     * 
     * @param documentId 文档ID
     * @param roleId 角色ID
     * @param permissions 权限列表
     * @param grantorId 授权人ID
     * @return 影响行数
     */
    Integer grantRolePermissions(@Param("documentId") String documentId, @Param("roleId") String roleId, @Param("permissions") List<String> permissions, @Param("grantorId") String grantorId);

    /**
     * 撤销角色权限
     * 
     * @param documentId 文档ID
     * @param roleId 角色ID
     * @param permissions 权限列表
     * @return 影响行数
     */
    Integer revokeRolePermissions(@Param("documentId") String documentId, @Param("roleId") String roleId, @Param("permissions") List<String> permissions);

    /**
     * 复制权限
     * 
     * @param sourceDocumentId 源文档ID
     * @param targetDocumentId 目标文档ID
     * @return 影响行数
     */
    Integer copyPermissions(@Param("sourceDocumentId") String sourceDocumentId, @Param("targetDocumentId") String targetDocumentId);

    /**
     * 继承权限
     * 
     * @param parentDocumentId 父文档ID
     * @param childDocumentId 子文档ID
     * @return 影响行数
     */
    Integer inheritPermissions(@Param("parentDocumentId") String parentDocumentId, @Param("childDocumentId") String childDocumentId);

    /**
     * 设置默认权限
     * 
     * @param documentId 文档ID
     * @param permissions 权限配置
     * @return 影响行数
     */
    Integer setDefaultPermissions(@Param("documentId") String documentId, @Param("permissions") Object permissions);

    /**
     * 查询有效权限
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 权限列表
     */
    List<String> selectEffectivePermissions(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 查询权限树
     * 
     * @param documentId 文档ID
     * @return 权限树
     */
    Object selectPermissionTree(@Param("documentId") String documentId);

    /**
     * 批量设置权限
     * 
     * @param documentIds 文档ID列表
     * @param permissions 权限配置
     * @return 影响行数
     */
    Integer batchSetPermissions(@Param("documentIds") List<String> documentIds, @Param("permissions") Object permissions);

    /**
     * 清理过期权限
     * 
     * @return 清理数量
     */
    Integer cleanupExpiredPermissions();

    /**
     * 权限审计
     * 
     * @param documentId 文档ID
     * @return 审计结果
     */
    Object auditPermissions(@Param("documentId") String documentId);

    /**
     * 查询权限变更历史
     * 
     * @param documentId 文档ID
     * @param limit 限制数量
     * @return 变更历史
     */
    List<Object> selectPermissionChangeHistory(@Param("documentId") String documentId, @Param("limit") Integer limit);

    /**
     * 导出权限配置
     * 
     * @param documentId 文档ID
     * @return 权限配置
     */
    Object exportPermissionConfig(@Param("documentId") String documentId);

    /**
     * 导入权限配置
     * 
     * @param documentId 文档ID
     * @param config 权限配置
     * @return 影响行数
     */
    Integer importPermissionConfig(@Param("documentId") String documentId, @Param("config") Object config);

    /**
     * 验证权限配置
     * 
     * @param config 权限配置
     * @return 验证结果
     */
    Object validatePermissionConfig(@Param("config") Object config);

    /**
     * 查询权限模板
     * 
     * @return 权限模板列表
     */
    List<Object> selectPermissionTemplates();

    /**
     * 应用权限模板
     * 
     * @param documentId 文档ID
     * @param templateId 模板ID
     * @return 影响行数
     */
    Integer applyPermissionTemplate(@Param("documentId") String documentId, @Param("templateId") String templateId);

    /**
     * 创建权限模板
     * 
     * @param name 模板名称
     * @param config 权限配置
     * @return 模板ID
     */
    String createPermissionTemplate(@Param("name") String name, @Param("config") Object config);

    /**
     * 查询权限统计
     * 
     * @param documentId 文档ID
     * @return 统计信息
     */
    Object selectPermissionStatistics(@Param("documentId") String documentId);

    /**
     * 同步权限
     * 
     * @param documentId 文档ID
     * @return 影响行数
     */
    Integer syncPermissions(@Param("documentId") String documentId);

    /**
     * 查询权限冲突
     * 
     * @param documentId 文档ID
     * @return 冲突信息
     */
    List<Object> selectPermissionConflicts(@Param("documentId") String documentId);

    /**
     * 解决权限冲突
     * 
     * @param documentId 文档ID
     * @param resolution 解决方案
     * @return 影响行数
     */
    Integer resolvePermissionConflicts(@Param("documentId") String documentId, @Param("resolution") Object resolution);

    /**
     * 查询权限依赖
     * 
     * @param documentId 文档ID
     * @return 依赖信息
     */
    List<Object> selectPermissionDependencies(@Param("documentId") String documentId);

    /**
     * 查询权限继承链
     * 
     * @param documentId 文档ID
     * @return 继承链信息
     */
    List<Object> selectPermissionInheritanceChain(@Param("documentId") String documentId);

    /**
     * 查询权限覆盖情况
     * 
     * @param documentId 文档ID
     * @param userId 用户ID
     * @return 覆盖情况
     */
    Object selectPermissionOverrides(@Param("documentId") String documentId, @Param("userId") String userId);

    /**
     * 批量检查权限
     * 
     * @param documentIds 文档ID列表
     * @param userId 用户ID
     * @param permission 权限类型
     * @return 权限检查结果
     */
    List<Object> batchCheckPermissions(@Param("documentIds") List<String> documentIds, @Param("userId") String userId, @Param("permission") String permission);

    /**
     * 查询权限矩阵
     * 
     * @param documentId 文档ID
     * @return 权限矩阵
     */
    Object selectPermissionMatrix(@Param("documentId") String documentId);

    /**
     * 权限快照
     * 
     * @param documentId 文档ID
     * @return 快照ID
     */
    String createPermissionSnapshot(@Param("documentId") String documentId);

    /**
     * 恢复权限快照
     * 
     * @param documentId 文档ID
     * @param snapshotId 快照ID
     * @return 影响行数
     */
    Integer restorePermissionSnapshot(@Param("documentId") String documentId, @Param("snapshotId") String snapshotId);
}
